package it.javaweb.actions;

import it.javaweb.actions.utenti.AuthenticationBean;
import it.javaweb.beans.Utente;
import it.javaweb.dao.UtenteDAO;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

public class LoginController extends SimpleFormController {

	@Autowired
	private UtenteDAO utenteDao;
	
	public LoginController() {
		setCommandClass( Utente.class );
	}

	public void setUtenteDao(UtenteDAO utenteDao) {
		this.utenteDao = utenteDao;
	}
	
	@Override
	protected Object formBackingObject(HttpServletRequest request) throws Exception {
		Utente u = (Utente) super.formBackingObject(request);
		if ( request.getParameter("login")!=null ) {
			u.setLogin( request.getParameter("login") );
		}
		return u; 
	}
	
	@Override
	protected Map referenceData(HttpServletRequest request) throws Exception {
		Map map = new HashMap();
		return map;
	}

	/** Nel caso di utente gia' autenticato va direttamente alla pagina HOME. */
	protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception {
		HttpSession session = request.getSession();
		AuthenticationBean ab  = (AuthenticationBean) session.getAttribute( "authenticationBean" );
		if ( ab!=null ) {
			return new ModelAndView( getSuccessView() );
		}
		return super.showForm(request, response, errors);
	}

	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
		Utente utente = (Utente) command;
		
		HttpSession session = request.getSession();

		Utente utenteDB = utenteDao.accessControl( utente.getLogin(), utente.getPassword() );
		if ( utenteDB!=null && utenteDB.isAttivo() ) {
			// Accesso effettuato.
			AuthenticationBean ab = new AuthenticationBean();
			ab.setUtente( utenteDB );
			ab.setLastAccess( utenteDB.getUltimoAccesso() );
			// salvo nella sessione il bean di autenticazione
			session.setAttribute( "authenticationBean", ab );

			String successView = getSuccessView();
			return new ModelAndView( successView );
		}
		
		// salvo lo user_id inserito per riproporlo
		request.setAttribute("login", utente.getLogin());
		return new ModelAndView( "accessDenied" );
	}

}
